package org.cnam.mobileShopping.view;

import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

import org.cnam.mobileShopping.R;
import org.cnam.mobileShopping.bean.MList;
import org.cnam.mobileShopping.bean.User;
import org.cnam.mobileShopping.controller.ListeController;
import org.cnam.mobileShopping.dao.DAOFactory;
import org.cnam.mobileShopping.util.MobileShoppingUtils;
import org.cnam.mobileShopping.util.NotificationUtil;
import org.cnam.mobileShopping.util.PatternUtil;
import org.cnam.mobileShopping.wsclient.WSClient;
import org.json.JSONException;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

/**
 * Classe main qui permet de se logger ou encore de se connecter directement au
 * projet.
 * 
 * @author lolo
 */
public class Main extends Activity implements Runnable {

	private ProgressDialog progress = null;
	/**
	 * Le handler qui va recevoir la réponse du thread de traitement pour la
	 * connexion
	 */
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			progress.dismiss();
			// est ce que tout c'est bien passé?
			if (msg.what == 0) {
				// ok maintenant , on va parcourir les listes qui ont été
				// updatées
				String updatedLists = MobileShoppingUtils.getSharedPreferences(
						Main.this, "updatedLists");
				// est ce qu'il y en a?
				if (!PatternUtil.isEmpty(updatedLists)) {
					for (String l : updatedLists.split(",")) {
						if (!PatternUtil.isEmpty(l) && !"null".equals(l)) {
							// là on récupère la liste en question
							MList list = ListeController.getList(Main.this,
									Integer.parseInt(l));
							Intent notificationIntent = new Intent(Main.this,
									ShowProductList.class);
							notificationIntent.putExtra("idListe",
									list.getMlistid());
							notificationIntent.putExtra("libelleListe",
									list.getLabel());
							NotificationUtil.launchNotification(
									Main.this,
									"Update",
									"Mise à jour de la liste "
											+ list.getLabel(),
									notificationIntent);
							// maintenant il faut enlever cette liste des shared
							// preferences car elle n'est plus à afficher
							String previousList = MobileShoppingUtils
									.getSharedPreferences(Main.this,
											"updatedLists");
							previousList.replace("," + list.getMlistid(), "");
							MobileShoppingUtils.addSharedPref(Main.this,
									"updatedLists", previousList);
						}
					}
				}

				Toast.makeText(Main.this, "LOGIN OK", Toast.LENGTH_LONG).show();
				Intent next = new Intent(Main.this, ShowList.class);
				startActivity(next);
				finish();
			} else if (msg.what == 1) {
				Toast.makeText(Main.this, "LOGIN NOK ", Toast.LENGTH_LONG)
						.show();
			}
		}
	};

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.main);
		// tiens, est ce que il y a un user dans les préférences?
		String login = MobileShoppingUtils.getSharedPreferences(Main.this,
				"userLogin");
		String mdp = MobileShoppingUtils.getSharedPreferences(Main.this,
				"userMdp");
		if (!PatternUtil.isEmpty(login) && !PatternUtil.isEmpty(mdp)) {
			((EditText) findViewById(R.id.mainLoginET)).setText(login);
			((EditText) findViewById(R.id.mainPasswordET)).setText(mdp);
			logMeIn();
		}
		// retrieve all elements that might be listened
		Button btnSubmit = (Button) findViewById(R.id.mainBtnSubmit);
		btnSubmit.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// \Fin des données à enlever
				logMeIn();
			}
		});
	}

	private void logMeIn() {
		// on affiche le login
		progress = ProgressDialog.show(Main.this, "", "Connexion...", true);
		Thread thread = new Thread(Main.this);
		thread.start();
	}

	@Override
	public void run() {
		// on récupère les informations de login
		String login = ((EditText) findViewById(R.id.mainLoginET)).getText()
				.toString();
		String mdp = ((EditText) findViewById(R.id.mainPasswordET)).getText()
				.toString();
		// XXX Enlever ces données de dev
		// login = "anne";
		// mdp = "7anne7";

		// ok maintenant on va checker si l'utilisateur est connu
		User u = null;
		try {
			u = WSClient.getInstance().getUser(login, mdp);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		// login réussi
		if (u != null) {
			// ok le login a réussi donc on va mettre le user dans les
			// sharedpreferences
			MobileShoppingUtils.addSharedPref(Main.this, "userid", u
					.getUserid().toString());
			MobileShoppingUtils.addSharedPref(Main.this, "userLogin", login);
			MobileShoppingUtils.addSharedPref(Main.this, "userMdp", mdp);
			// voilà maintenant, le userid est stocké et accessible par
			// toutes les autres classes

			String dateUpdate = MobileShoppingUtils.getSharedPreferences(
					Main.this, "dateUpdate");
			Date dateDebutAnnee = null;
			if (PatternUtil.isEmpty(dateUpdate)) {
				Calendar cal = Calendar.getInstance();
				cal.set(Calendar.MONTH, Calendar.JANUARY);
				cal.set(Calendar.DAY_OF_MONTH, 1);
				dateDebutAnnee = cal.getTime();
				MobileShoppingUtils.addSharedPref(Main.this, "dateUpdate",
						PatternUtil.formatDate(dateDebutAnnee));
			} else {
				dateDebutAnnee = PatternUtil.formatDate(dateUpdate);
			}

			DAOFactory.getCategoryDAO(Main.this).synchronise(dateDebutAnnee,
					u.getUserid(), Main.this);
			DAOFactory.getProductDAO(Main.this).synchronise(dateDebutAnnee,
					u.getUserid(), Main.this);
			DAOFactory.getUserDAO(Main.this).synchronise(dateDebutAnnee,
					u.getUserid(), Main.this);
			DAOFactory.getListeDAO(Main.this).synchronise(dateDebutAnnee,
					u.getUserid(), Main.this);

			handler.sendEmptyMessage(0);
		} else {
			try {
				Integer.parseInt(MobileShoppingUtils.getSharedPreferences(
						Main.this, "userid"));
				handler.sendEmptyMessage(0);
			} catch (NumberFormatException e) {
				handler.sendEmptyMessage(1);
			}
		}
	}
}